﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Drawing.Drawing2D;

namespace TargetControl
{
    /// <summary>
    /// Lớp vòng tròn tính điểm
    /// </summary>
    public class ScoreCircles
    {
        //Tâm x của vòng tròn
        private int x;
        //Tâm y của vòng tròn
        private int y;
        //Bán kính vòng tròn (bán kính vòng tròn nhỏ nhất)
        private float r;

        //Số vòng tròn cần vẽ (tương ứng với các mức thang điểm)
        private int level = 5;

        //Vẽ vòng tròn active hiện tại (vòng tròn tính điểm)
        private int activeLevel = -1;

        //Vòng tròn active gần nhất
        private int lastActiveLevel = -1;

        public int X
        {
            get
            {
                return x;
            }
            set
            {
                x = value;
            }
        }

        public int Y
        {
            get
            {
                return y;
            }
            set
            {
                y = value;
            }
        }

        public float R
        {
            get
            {
                return r;
            }
            set
            {
                r = value;
            }
        }

        public int Level
        {
            get
            {
                return level;
            }
            set
            {
                level = value;
            }
        }

        public int ActiveLevel
        {
            get
            {
                return activeLevel;
            }
            set
            {
                activeLevel = value;
            }
        }

        public int LastActiveLevel
        {
            get
            {
                return lastActiveLevel;
            }
            set
            {
                lastActiveLevel = value;
            }
        }

        public ScoreCircles()
        {

        }

        public void Draw(Graphics g, Projection pr)
        {
            int rCircle = (int)(pr.FromCentimetToPixelDistance(r));
            //Tính tọa độ vẽ bia
            PointF point1 = new PointF(X, Y);
            Point p1 = pr.FromCentiToPixel(point1);
            int x1 = p1.X;
            int y1 = p1.Y;

            //Vẽ vòng tròn tính điểm
            Pen penScoreCirle = new Pen(Color.Yellow);
            int r1 = rCircle; //bán kính nhỏ nhất;
            for (int i = 0; i < level; i++)
            {
                Rectangle rect = new Rectangle(x1 - r1, y1 - r1, 2 * r1, 2 * r1);
                ////Nếu là vẽ vòng tròn tính điểm
                //if (r1 == activeLevel)
                //{
                //    //Nếu điểm bắn vẫn nằm trong vòng tròn tính điểm thì bỏ qua không vẽ nữa
                //    if (activeLevel == lastActiveLevel)
                //        return;
                //    //Kiểm tra vòng tròn nằm trong giới hạn số vòng vẽ
                //    if (activeLevel > rCircle * level)
                //        return;

                //    //Vẽ vòng tròn active
                //    Pen penActive = new Pen(Brushes.Red);
                //    g.DrawEllipse(penActive, rect);
                //    penActive.Dispose();
                //}
                //else if (r1 == lastActiveLevel) //Nếu là vòng
                //{
                //    //Vẽ vòng tròn active
                //    Pen penLastActive = new Pen(Brushes.Yellow);
                //    g.DrawEllipse(penLastActive, rect);
                //    penLastActive.Dispose();
                //}
                //else
                //{
                    //Nếu là vòng tròn tính điểm
                    g.DrawEllipse(penScoreCirle, rect);
                //}
                r1 += rCircle;
            }

            penScoreCirle.Dispose();
        }

        public void DrawActive(Graphics g, Projection pr)
        {
            if (activeLevel == lastActiveLevel)
                return;

            int rCircle = (int)(pr.FromCentimetToPixelDistance(r));
            //Tính tọa độ vẽ bia
            PointF point1 = new PointF(X, Y);
            Point p1 = pr.FromCentiToPixel(point1);
            int x1 = p1.X;
            int y1 = p1.Y;

            int r1 = 0;
            //Vẽ vòng tròn active 
            if (activeLevel > 0)
            {
                //Active R
                r1 = rCircle * activeLevel;
                //Vẽ vòng tròn active
                Pen penActive = new Pen(Brushes.Red);
                Rectangle rect = new Rectangle(x1 - r1, y1 - r1, 2 * r1, 2 * r1);
                g.DrawEllipse(penActive, rect);
            }

            //Reset lại vòng tròn last active
            if (lastActiveLevel > 0)
            {
                //Last active R
                r1 = rCircle * lastActiveLevel;
                //Vẽ vòng tròn active
                Pen penLastActive = new Pen(Brushes.Yellow);
                Rectangle rect = new Rectangle(x1 - r1, y1 - r1, 2 * r1, 2 * r1);
                g.DrawEllipse(penLastActive, rect);
            }
        }

        /// <summary>
        /// Tính điểm bằng cách tính khoảng cách giữa điểm bắn với tâm vòng tròn nếu < R lớn nhất đó
        /// </summary>
        public int GetScore(PointF p)
        {
            int mark;

            //bán kính tối đa
            double maxR = level * r; 

            //Tính bán kính điểm bắn
            double x2 = Math.Pow((double)(p.X - X), 2);
            double y2 = Math.Pow((double)(p.Y - Y), 2);
            double r1 = Math.Sqrt(x2 + y2);

            //Lưu last active
            lastActiveLevel = activeLevel;

            //Nếu bán kính điểm bắn lớn hơn bán kính mức vòng tròn ngoài cùng thì điểm = 0 
            if (r1 > maxR)
            {
                mark = 0;
                activeLevel = -1;
            }
            else
            {
                double R = 0;
                int lev = 0;
                mark = 11;
                do
                {
                    //Tăng vòng tròn tính từ vòng tròn mức điểm 10
                    lev++;
                    //Giảm thang điểm tính từ điểm 10
                    mark--;
                    //Tính bán kính thang điểm mức lev
                    R = lev * r;
                } while (r1 > R); //Nếu bán kính điểm bắn mà lớn hơn bán kính vòng tròn R thì tiếp tục vòng lặp
                activeLevel = lev;
            }

            return mark;
        }
       
    }
}
